Principe

Le démonstrateur est une application shiny permettant de visualiser un tableau de bord d’indicateurs en fonction de la sélection par l’utilisateur d’un point de pêche ou d’une aire géographique.

L’information contenue dans la base Aspe étant tabulée, il faut la spatialiser pour permettre la sélection géographique. Pour une rapidité d’affichage satisfaisante, les opérations les plus lourdes de traitement (ex : intersections géographiques) sont au maximum réalisées lors de prétraitements, donc en dehors de l’appli. Les données sont autant que possible agrégées pour diminuer la taille des tables.

Ces opérations de prétraitement ne sont pas spécifiques au développement du démonstrateur. Au contraire elles sont assez génériques pour qui souhaite exploiter la base Aspe pour calculer sur un périmètre donné, une période donnée, etc. des indicateurs comme les abondances, densités, IPR et autres. Elles ont donc fait l’objet du développement, à part, d’un package R nommé {aspe}. Certaines des données géographiques sont téléchargées et mises en forme au moyen du package {tod}.

Préparation des données tabulées

Chargement des packages

library(aspe)
library(tidyverse)

Chargement des tables

Les données ont été parsées depuis un dump (sauvegarde compressée) de la base Aspe (cf. ce tuto).

load(file = "raw_data/toutes_tables_aspe_sauf_mei.RData")

Assemblage et filtrage des données

Le principe pour utiliser les tables de la base sql d’origine est de constituer un dataframe “passerelle” qui relie les tables d’origine par les identifiants de leurs objets (stations, points, opérations, lots, etc.). On peut ensuite compléter cette ossature par des jointures sur les champs contenant les identifiants. La démarche se retrouve systématiquement dans les traitements donc elle n’a été détaillée qu’une fois dans ce tuto.

On ne conserve que les pêches réalisées dans le cadre des réseaux, complètes et réalisées sans bateau, ce qui est simple avec les fonctions mef_select_obj(), mef_select_proto() et mef_select_mop(). On rajoute les dates de prospection et une variable annee, avec la fonction mef_ajouter_ope_date() pour permettre des agrégations annuelles.

On ajoute enfin des données de captures au niveau des lots (sans les mesures individuelles) avec mef_ajouter_lots().

data <- mef_creer_passerelle() %>% # création passerelle
  mef_select_obj(objectif = 2:6) %>% # les obj 2 à 6 sont les réseaux
  mef_select_proto(protocole = 1) %>% # pêches complètes
  mef_select_mop(moyen_prospection = 1) %>% # à pied
  mef_ajouter_ope_date() %>%  # ajout date et année
  mef_ajouter_lots() %>%  # ajout des lots (effectif par espèce)
  mef_ajouter_surf_calc() %>%  # ajout des surfaces prospectées pour calculer les densités
  mef_ajouter_libelle() # ajout libellé du point de prélèvement

Agrégation pour simplifier le tableau

captures <- data %>%
  group_by(sta_id, pop_id, ope_id, ope_date, annee, esp_code_alternatif,
           ope_surface_calculee, pop_libelle) %>%
    summarise(effectif = sum(lop_effectif, na.rm = TRUE)) %>%
  ungroup()

A ce stade on peut observer quelques lignes du tableau, tirées au hasard :

captures %>% 
  sample_n(10) %>% 
  knitr::kable(align = "c")
sta_id pop_id ope_id ope_date annee esp_code_alternatif ope_surface_calculee pop_libelle effectif
10977 43181 8112 2014-08-19 08:00:00 2014 LPM 495.00 Dourduff à Garlan 1
16932 61301 39635 2018-09-17 09:15:00 2018 TRF 924.12 La Selves à Laguiole (station RCS et RHP 05121001) 362
9513 36903 17175 2012-09-04 10:30:00 2012 BOU 1012.50 Echandon à Saint-branchs 143
22724 77725 39497 2018-09-12 10:00:00 2018 TRF 1522.50 L’Aude au Clat 550
22980 78460 35550 1996-07-22 09:30:00 1996 LOF 1026.63 L’Orbieu à Ribaute 112
236 1368 1577 2005-09-15 10:00:00 2005 LPP 1892.00 La Hem à Recques sur Hem 10
9309 35803 22834 1995-07-06 14:50:00 1995 GOU 770.50 Tardes à Saint-silvain-bellegarde 9
9933 39187 7952 2017-08-30 09:00:00 2017 SPI 657.00 Merdereau à Saint-paul-le-gaultier 115
8976 34085 23622 2015-07-07 09:30:00 2015 CHA 1141.00 Desges à Desges 74
23142 78977 34027 1993-06-24 09:30:00 1993 GOU 1276.00 Le Lez à Castelnau-le-Lez 2

Préparation des données spatiales

Il s’agit ici d’opérer les étapes qui permettront un affichage spatialisé des données élémentaires (les points de prélèvement) ou agrégées sur un territoire qui peut être administratif (par exemple un département) ou hydrographique (un bassin hydro), voire un peu des deux (un SAGE). Les étapes seront :

  • Téléchargement des découpages territoriaux fins
  • Agrégation aux échelles supérieures
  • Spatialisation des points de prélèvement
  • Attribution à chaque point de son département, sa région, son secteur hydrographique
  • Simplification des découpages géographiques pour un affichage plus rapide

Chargement des découpages géographiques

Bassins hydrographiques

Le découpage des bassins au sens de la DCE est téléchargeable depuis data.gouv.fr, au format GeoJSON ou shapefile.

Un découpage plus fin est disponible sur la page Zones hydrographiques - Métropole 2016 - BD Carthage du portail geo.data.gouv.fr et télécharger le shapefile à cette URL. La fonction sie_carthage_bassins_tod() du package {tod} permettent d’enchaîner le téléchargement, la décompression et la lecture de la couche shapefile proposée. Par défaut l’archive zip et les fichiers décompressés sont stockés dans un sous-répertoire "raw_data" qui est créé s’il ne pré-existe pas.

Comme notre étude est restreinte à la France continentale, l’ensemble des objets géographiques seront en Lambert 93 (EPSG:2154). Si l’on avait besoin de couvrir les outre-mers, on aurait choisi le WGS84 (EPSGG:4326).

bv <- tod::sie_carthage_bassins_tod(repertoire = "raw_data")

Les districts hydrographiques n’étant pas renseignés dans notre couche géographique, on a recours à de la donnée externe (un peu bidouillée - à voir comment obtenir plus sûr) pour agréger au niveau supérieur.

districts <- readxl::read_xlsx("raw_data/corresp_rh_dh.xlsx")
bv <- bv %>% 
  left_join(y = districts)

On peut alors créer les objets de classe sf qui permettront d’attribuer à chaque point son appartenance au découpage hydrographique à différentes échelles. Pour les besoins du présent projet, il faut que les sélections géographiques comprennent plusieurs stations d’échantillonnage, ce qui contraint la finesse du découpage. Ici, nous retenons les échelles des districts hydro subdivisés en * “régions hydro puis en secteurs hydrographiques. La fonction sie_carthage_bassins_agr() du package {tod} permet de regroupes les”zones hydro" en “secteurs hydro”, etc. . L’argument prop_pts_a_garder = 1 signifie que 100% des points sont conservés.

sh_geo <- bv %>% 
  tod::sie_carthage_bassins_agr(echelle = "Secteur_Hydro")

rh_geo <- bv %>% 
  tod::sie_carthage_bassins_agr(echelle = "Region_Hydro")

dh_geo <- bv %>% 
  tod::sie_carthage_bassins_agr(echelle = "District_Hydro")

Visualisation.

sh_geo %>%
  ggplot() +
    geom_sf()

Entités administratives

Pour le découpage administratif, on part de la BD Admin Express mise à disposition par l’IGN. Après pas mal d’essais, pas réussi à décompresser l’archive avec la fonction unzip() de R base, d’où l’utilisation du package archive de Jim Hester (solution empruntée à T. Giraud).

Si nécessaire :

remotes::install_github("jimhester/archive")

Puis téléchargement et décompression des données.

150Mo environ \(\Rightarrow\) le téléchargement prend un peu de temps. Ne pas hésiter à réessayer en cas d’erreur, ça peut venir de la connexion ou du serveur.

url <- "https://www.data.gouv.fr/fr/datasets/r/989a9b36-e12a-4d28-a9b9-8eaf3955e8d3"

tf <- tempfile() # Création d'un nom de fichier temporaire

download.file(url, tf , mode = "wb") # Téléchargement 

# Décompression dans un sous-répertoire
archive::archive_extract(archive::archive(path = tf),
                         dir = "raw_data/admin_express")

Fichiers shapefile des départements et des régions.

fichier_depts <- "raw_data/admin_express/ADMIN-EXPRESS-COG_2-1__SHP__FRA_2020-11-20/ADMIN-EXPRESS-COG/1_DONNEES_LIVRAISON_2020-11-20/ADE-COG_2-1_SHP_WGS84G_FRA/DEPARTEMENT_CARTO.shp"

fichier_regs <- "raw_data/admin_express/ADMIN-EXPRESS-COG_2-1__SHP__FRA_2020-11-20/ADMIN-EXPRESS-COG/1_DONNEES_LIVRAISON_2020-11-20/ADE-COG_2-1_SHP_WGS84G_FRA/REGION_CARTO.shp"

Lecture et reprojection en Lambert 93 comme le découpage hydrographique.

depts_geo <- sf::read_sf(fichier_depts) %>% 
  sf::st_transform(crs = 2154)

regs_geo <- sf::read_sf(fichier_regs) %>% 
  sf::st_transform(crs = 2154)

Visualisation

depts_geo %>%
  filter(str_length(INSEE_DEP) == 2) %>% # métropole
  ggplot() +
    geom_sf()

Spatialisation des points

Principe

Dans Aspe, l’entité spatiale de base, toujours identifiée, est le point de pêche. Tous sont géoréférencés, mais pas tous dans le même CRS. On va donc collecter les codes EPSG associés aux coordonnées de chacun des points, puis les reprojeter en Lambert 93.

Référentiels

Dans la table ref_type_projection, il apparaît que pour le Lambert II étendu, le code EPSG (27572) est manquant. Il faut donc la compléter (la version à venir de la base devrait voir cette ommission corrigée).

ref_type_projection <- ref_type_projection %>%
  geo_completer_ref_type_projection()

Géoréférencement

pop <- point_prelevement %>%
  rename(sta_id = pop_sta_id) %>% # nécessaire pour la jointure de mef_ajouter_libelle
  mef_ajouter_libelle() %>% 
  geo_ajouter_crs(var_id_crs = "pop_typ_id") %>% 
  select(pop_id, pop_libelle, pop_coordonnees_x, pop_coordonnees_y, typ_code_epsg)

Conversion des coordonnées.

coords <- geo_convertir_coords_df(df = pop,
                                  var_x = "pop_coordonnees_x",
                                  var_y = "pop_coordonnees_y",
                                  var_crs_initial = "typ_code_epsg",
                                  crs_sortie = 2154) %>%
  rename(x_l93 = X, y_l93 = Y)

Sélection du périmètre

Sélection d’une fenêtre de coordonnées couvrant la France continentale et transformation du dataframe des points en objet géographique de classe sf.

pop_geo <- pop %>%
  bind_cols(coords) %>%
  filter(x_l93 > 100000,
         x_l93 < 1100000,
         y_l93 > 6100000,
         y_l93 < 7200000) %>% 
  sf::st_as_sf(coords = c("x_l93", "y_l93"), crs = 2154)

Visualisation d’un échantillon des points.

mapview::mapview(sample_n(pop_geo, 100), col.regions = "red") +
  mapview::mapview(rh_geo)

Assignation des points

On complète le dataframe pop_geo en attribuant à chacun des points son appartenance à un secteur / région / district hydrographique, à un département et à une région.

pop_geo <- pop_geo %>% 
  geo_attribuer(poly_sf = depts_geo) %>% 
  geo_attribuer(poly_sf = regs_geo) %>% 
  geo_attribuer(poly_sf = sh_geo) %>% 
  geo_attribuer(poly_sf = rh_geo) %>% 
  geo_attribuer(poly_sf = dh_geo) %>% 
  select(pop_id, pop_libelle,
         dept_num = INSEE_DEP, dept_lib = NOM_DEP,
         reg_num = INSEE_REG.y, reg_lib = NOM_REG,
         CdSecteurHy = CdSecteurH, LbSecteurHy = LbSecteurH,
         CdRegionHy, LbRegionHy,
         CdDistrictHy, LbDistrictHy)

Simplification des découpages géographiques

Pour les besoins ci-dessus d’attribution à chaque point de prélèvement d’une région hydro, d’un département, etc. il était nécessaire d’employer des couches d’information géographique précises en particulier parce que les limites de départements sony souvent des cours d’eau. En revanche pour la visualisation on va simplifier les polygones pour les alléger et gagner en rapidité d’affichage. Ici on supprime 99% des points tout en conservant la topologie (gestion des limites communes entre polygones pour éviter de créer des interstices ou des chevauchements).

depts_geo <- rmapshaper::ms_simplify(depts_geo, keep = 0.01)
regs_geo <- rmapshaper::ms_simplify(regs_geo, keep = 0.01)
sh_geo <- rmapshaper::ms_simplify(sh_geo, keep = 0.01)
rh_geo <- rmapshaper::ms_simplify(rh_geo, keep = 0.01)
dh_geo <- rmapshaper::ms_simplify(dh_geo, keep = 0.01)

Visualisation avec le package ggplot2.

ggplot(sh_geo) + geom_sf()

Sauvegarde des données préparées

save(captures, file = "processed_data/captures.RData")
save(pop_geo, file = "processed_data/pop_geo.RData")
save(depts_geo, regs_geo, sh_geo, rh_geo, dh_geo, file = "processed_data/poly_geo_simp.RData")